/**
 * @file UnidadeTiposBasicos.cpp
 * @author  Patrick Kabongo Cisuaka 09/53806 & Yuri Lavinas 09/0015266
 *\date Criacao: 20/janeiro/2013
 *
 *  Essa unidade contem as codificacoes das classes que representam os dominios chamadas Tipos basicos.
 *  As classes sao: Nome, Senha, Id, Postagem, Comentario, Data e Avaliacao.
 *
 */
#include <sstream>
#include <string>
#include "UnidadeTiposBasicos.h"

/**
     * A codificacao da classe Tipo basico Nome. Temos a funcao Validar para
     * validar o dominio que a classe Nome representa
     * e alem disso,em caso de falha na validacao, deve
     * ser lancado uma excecao.
     */
Nome::Nome(string nome) throw (invalid_argument){
        validar(nome);
        valor = nome;
}

void Nome::validar(string nome) throw (invalid_argument){
        if (nome.size() == 0 || nome.size() > 10)
                throw invalid_argument("Nome formato incorreto.");
        for (unsigned int i = 0; i < nome.size(); i++) {
            if (!isspace(nome.at(i)) &&
                !isupper(nome.at(i)) &&
                !islower(nome.at(i)))
                    throw invalid_argument("Nome formato incorreto.");
        }
}

/**
     * A codificacao da classe Tipo basico Senha. Temos a funcao Validar para
     * validar o dominio que a classe Senha representa
     * e alem disso,em caso de falha na validacao, deve
     * ser lancado uma excecao.
     */

Senha::Senha(string senha) throw (invalid_argument){
        validar(senha);
        valor = senha;
}

void Senha::validar(string senha) throw (invalid_argument){
        if (senha.size() != 6)
                throw invalid_argument("Senha formato incorreto.");
        for (unsigned int i = 0; i < senha.size(); i++) {
            if (!isdigit(senha.at(i)) &&
            	!isupper(senha.at(i)) &&
                !islower(senha.at(i)))
                    throw invalid_argument("Senha formato incorreto.");
        }
}

/**
     * A codificacao da classe Tipo basico Identificador. Temos a funcao Validar para
     * validar o dominio que a classe Identificador representa
     * e alem disso,em caso de falha na validacao, deve
     * ser lancado uma excecao.
     */

Id::Id(string id)throw (invalid_argument) {
        validar(id);
        valor = id;
}

void Id::validar(string id) throw (invalid_argument){
        if (id.size() != 5)
                throw invalid_argument("Identificador formato incorreto.");
        for (unsigned int i = 0; i < id.size(); i++) {
            if (!isdigit(id.at(i)))
                    throw invalid_argument("Identificador formato incorreto.");
        }
}

/**
     * A codificacao da classe Tipo basico Postagem. Temos a funcao Validar para
     * validar o dominio que a classe Postagem representa
     * e alem disso,em caso de falha na validacao, deve
     * ser lancado uma excecao.
     */

Postagem::Postagem(string postagem) throw (invalid_argument){
        validar(postagem);
        valor = postagem;
}

void Postagem::validar(string postagem) throw (invalid_argument){
        if (postagem.size() > 30)
                throw invalid_argument("Postagem formato incorreto.");
        for (unsigned int i = 0; i < postagem.size(); i++) {
            if (!isdigit(postagem.at(i))&&
                !isupper(postagem.at(i)) &&
                !islower(postagem.at(i)) &&
                !isspace(postagem.at(i)))
                    throw invalid_argument("Postagem formato incorreto.");
        }
}

/**
     * A codificacao da classe Tipo basico Comentario. Temos a funcao Validar para
     * validar o dominio que a classe Comentario representa
     * e alem disso,em caso de falha na validacao, deve
     * ser lancado uma excecao.
     */

Comentario::Comentario(string comentario) throw (invalid_argument){
        validar(comentario);
        valor = comentario;
}

void Comentario::validar(string comentario) throw (invalid_argument){
        if (comentario.size() > 20)
                throw invalid_argument("Comentario formato incorreto.");
        for (unsigned int i = 0; i < comentario.size(); i++) {
            if (!isdigit(comentario.at(i)) &&
                !isupper(comentario.at(i)) &&
                !islower(comentario.at(i)) &&
                !isspace(comentario.at(i)))
                    throw invalid_argument("Comentario formato incorreto.");
        }
}


/**
     * A codificacao da classe Tipo basico Data. Temos a funcao Validar para
     * validar o dominio que a classe Data representa
     * e alem disso,em caso de falha na validacao, deve
     * ser lancado uma excecao.
     */
Data::Data(string data) throw (invalid_argument){
        validar(data);
        valor = data;
}

void Data::validar(string data) throw (invalid_argument){
        if (data.size() != 10)
                throw invalid_argument("Data formato incorreto.");
        for (unsigned int i = 0; i < data.size(); i++) {
            if (!isdigit(data.at(i)) &&
            	!ispunct(data.at(i)))
                    throw invalid_argument("Data formato incorreto.");
        }
}

/**
     * A codificacao da classe Tipo basico Avaliacao. Temos a funcao Validar para
     * validar o dominio que a classe Avaliacao representa
     * e alem disso,em caso de falha na validacao, deve
     * ser lancado uma excecao.
     */

Avaliacao::Avaliacao(string avaliacao) throw (invalid_argument){
        validar(avaliacao);
        valor = avaliacao;
}

void Avaliacao::validar(string avaliacao) throw (invalid_argument){
        if (avaliacao.size() == 0 || avaliacao.size() > 1)
                throw invalid_argument("Avaliacao formato incorreto.");
        int number;
        istringstream ss(avaliacao);
        ss >> number;
        if(number!=1 && number!=2 && number!=3 && number!=4 && number!=5)
        		throw invalid_argument("Avaliacao formato incorreto.");
        if (!isdigit(number))
                throw invalid_argument("Avaliacao formato incorreto.");

}



